package br.com.baco.recurso.persistencia;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import br.com.baco.persistencia.AndroidDatabase;
import br.com.baco.recurso.dominio.Recurso;

public class RecursoDAO extends AndroidDatabase implements IRecursoDAO {
	
	public static final String NOME_TABELA = "recursos";
    public static final String COLUNA_ID = "id";
    public static final String COLUNA_NOME = "nome";
    public static final String COLUNA_DESCRICAO = "descricao";
    public static final String COLUNA_TIPO = "tipo";
    public static final String COLUNA_PRECO = "preco";
    public static final String COLUNA_QUANTIDADE = "quantidade";
    public static final String COLUNA_ID_EVENTO = "id_evento";

	public RecursoDAO(Context context) {
		// TODO Auto-generated constructor stub
		super(context);
	}

	@Override
	public Recurso salvar(Recurso recurso) {
		// TODO Auto-generated method stub
		int id;
		ContentValues values = this.getContentValues(recurso);
		this.openConnection();
		id = (int) this.database.insert(NOME_TABELA, null, values);
		if(id != -1){
			recurso.setId(id);
			this.closeConnection();
			return recurso;
		}
		this.closeConnection();
		return null;
	}

	@Override
	public boolean editar(Recurso recurso) {
		// TODO Auto-generated method stub
		ContentValues values = this.getContentValues(recurso);
		this.openConnection();
		String[] substitutesValues = {
                String.valueOf(recurso.getId())
        };
		
		if(this.database.update(NOME_TABELA, values, COLUNA_ID + " = ?", substitutesValues) != 0){
			this.closeConnection();
			return true;
		}
		
		this.closeConnection();
		return false;
	}

	@Override
	public boolean excluir(Recurso recurso) {
		// TODO Auto-generated method stub
		this.openConnection();
		String[] substitutesValues = {
				 String.valueOf(recurso.getId())
		};
		if(this.database.delete(NOME_TABELA, COLUNA_ID + " =  ?", substitutesValues) != 0){
			 this.closeConnection();
			 return true;
		}
		this.closeConnection();
		return false;
	}

	@Override
	public Recurso getById(int id) {
		// TODO Auto-generated method stub
		this.openConnection();
		String query = "SELECT * FROM " + NOME_TABELA +" WHERE "+COLUNA_ID+" = ?";
		String[] substitutesValues = {String.valueOf(id)};
        Cursor cursor = this.database.rawQuery(query, substitutesValues);
        List<Recurso> recursos = this.getObjectOfCursor(cursor);
        this.closeConnection();
 
        return recursos.isEmpty()? null: recursos.get(0);
	}

	@Override
	public List<Recurso> getAll() {
		// TODO Auto-generated method stub
		this.openConnection();
		String query = "SELECT * FROM " + NOME_TABELA;
        Cursor cursor = this.database.rawQuery(query, null);
        List<Recurso> recursos = this.getObjectOfCursor(cursor);
        this.closeConnection();
 
        return recursos;
	}
	
	@Override
	public List<Recurso> getByIdEvento(int id) {
		// TODO Auto-generated method stub
		this.openConnection();
		String query = "SELECT * FROM " + NOME_TABELA +" WHERE "+COLUNA_ID_EVENTO+" = ?";
		String[] substitutesValues = {String.valueOf(id)};
        Cursor cursor = this.database.rawQuery(query, substitutesValues);
        List<Recurso> recursos = this.getObjectOfCursor(cursor);
        this.closeConnection();
 
        return recursos;
	}

	@Override
	public ContentValues getContentValues(Recurso recurso) {
		// TODO Auto-generated method stub
		ContentValues values = new ContentValues();
		
		values.put(COLUNA_NOME, recurso.getNome());
		values.put(COLUNA_DESCRICAO, recurso.getDescricao());
		values.put(COLUNA_TIPO, recurso.getTipo());
		values.put(COLUNA_PRECO, recurso.getPreco());
		values.put(COLUNA_QUANTIDADE, recurso.getQuantidade());
		values.put(COLUNA_ID_EVENTO, recurso.getEvento().getId());
		
		return values;
	}

	@Override
	public List<Recurso> getObjectOfCursor(Cursor cursor) {
		// TODO Auto-generated method stub
		List<Recurso> recursos = new ArrayList<Recurso>();
        if(cursor == null)
            return recursos;
         
        try {
 
            if (cursor.moveToFirst()) {
                do {
 
                    int indexId = cursor.getColumnIndex(COLUNA_ID);
                    int indexNome = cursor.getColumnIndex(COLUNA_NOME);
                    int indexDescricao = cursor.getColumnIndex(COLUNA_DESCRICAO);
                    int indexTipo = cursor.getColumnIndex(COLUNA_TIPO);
                    int indexPreco = cursor.getColumnIndex(COLUNA_PRECO);
                    int indexQuant = cursor.getColumnIndex(COLUNA_QUANTIDADE);
                    
                    Recurso recurso = new Recurso();
                    recurso.setId(cursor.getInt(indexId));
                    recurso.setNome(cursor.getString(indexNome));
                    recurso.setDescricao(cursor.getString(indexDescricao));
                    recurso.setTipo(cursor.getString(indexTipo));
                    recurso.setPreco(cursor.getDouble(indexPreco));
                    recurso.setQuantidade(cursor.getInt(indexQuant));
 
                    recursos.add(recurso);
 
                } while (cursor.moveToNext());
            }
             
        } finally {
            cursor.close();
        }
        return recursos;
	}

}
